From e351818d402419da30bcd2e13ec0896d66b990d6 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Mon, 31 Aug 2009 10:06:53 +0100 Subject: [PATCH] introduce size_param() With there being several instances of custom_param() where the handler is just invoking parse_size_and_unit(), it seems to make sense to introduce a simplifying abstraction. Also fix serial_txbufsz not having been guaranteed to be a power of two. Signed-off-by: Jan Beulich --- xen/arch/ia64/xen/domain.c | 6 +----- xen/arch/x86/e820.c | 5 ++--- xen/common/kernel.c | 15 +++++++++++++++ xen/drivers/char/console.c | 6 ++---- xen/drivers/char/serial.c | 17 +++++++++-------- xen/include/xen/init.h | 13 ++++++++++++- 6 files changed, 41 insertions(+), 21 deletions(-) diff --git a/xen/arch/ia64/xen/domain.c b/xen/arch/ia64/xen/domain.c index c8ba9e28eb..60b20b5363 100644 --- a/xen/arch/ia64/xen/domain.c +++ b/xen/arch/ia64/xen/domain.c @@ -2387,11 +2387,7 @@ arch_do_vcpu_op(int cmd, struct vcpu *v, XEN_GUEST_HANDLE(void) arg) return rc; } -static void __init parse_dom0_mem(char *s) -{ - dom0_size = parse_size_and_unit(s, NULL); -} -custom_param("dom0_mem", parse_dom0_mem); +size_param("dom0_mem", dom0_size); /* * Helper function for the optimization stuff handling the identity mapping diff --git a/xen/arch/x86/e820.c b/xen/arch/x86/e820.c index db258ecc82..b87990a7f4 100644 --- a/xen/arch/x86/e820.c +++ b/xen/arch/x86/e820.c @@ -11,9 +11,8 @@ #include /* opt_mem: Limit of physical RAM. Any RAM beyond this point is ignored. */ -unsigned long long opt_mem; -static void parse_mem(char *s) { opt_mem = parse_size_and_unit(s, NULL); } -custom_param("mem", parse_mem); +static unsigned long long __initdata opt_mem; +size_param("mem", opt_mem); /* opt_nomtrr_check: Don't clip ram to highest cacheable MTRR. */ static int __initdata e820_mtrr_clip = -1; diff --git a/xen/common/kernel.c b/xen/common/kernel.c index 971d723109..9dadffec73 100644 --- a/xen/common/kernel.c +++ b/xen/common/kernel.c @@ -92,6 +92,21 @@ void cmdline_parse(char *cmdline) bool_assert = !bool_assert; *(int *)param->var = bool_assert; break; + case OPT_SIZE: { + uint64_t sz = parse_size_and_unit(optval, NULL); + switch ( param->len ) + { + case sizeof(uint32_t): + *(uint32_t *)param->var = sz; + break; + case sizeof(uint64_t): + *(uint64_t *)param->var = sz; + break; + default: + BUG(); + } + break; + } case OPT_CUSTOM: ((void (*)(const char *))param->var)(optval); break; diff --git a/xen/drivers/char/console.c b/xen/drivers/char/console.c index 3f83745d86..98fc4615c4 100644 --- a/xen/drivers/char/console.c +++ b/xen/drivers/char/console.c @@ -59,10 +59,8 @@ static int opt_console_timestamps; boolean_param("console_timestamps", opt_console_timestamps); /* conring_size: allows a large console ring than default (16kB). */ -static uint32_t opt_conring_size; -static void parse_conring_size(char *s) -{ opt_conring_size = parse_size_and_unit(s, NULL); } -custom_param("conring_size", parse_conring_size); +static uint32_t __initdata opt_conring_size; +size_param("conring_size", opt_conring_size); #define _CONRING_SIZE 16384 #define CONRING_IDX_MASK(i) ((i)&(conring_size-1)) diff --git a/xen/drivers/char/serial.c b/xen/drivers/char/serial.c index 3d261caa47..af1fe4f3c7 100644 --- a/xen/drivers/char/serial.c +++ b/xen/drivers/char/serial.c @@ -19,11 +19,7 @@ /* #define SERIAL_NEVER_DROP_CHARS 1 */ unsigned int serial_txbufsz = 16384; -static void __init parse_serial_tx_buffer(const char *s) -{ - serial_txbufsz = max((unsigned int)parse_size_and_unit(s, NULL), 512u); -} -custom_param("serial_tx_buffer", parse_serial_tx_buffer); +size_param("serial_tx_buffer", serial_txbufsz); #define mask_serial_rxbuf_idx(_i) ((_i)&(serial_rxbufsz-1)) #define mask_serial_txbuf_idx(_i) ((_i)&(serial_txbufsz-1)) @@ -493,9 +489,14 @@ void serial_register_uart(int idx, struct uart_driver *driver, void *uart) void serial_async_transmit(struct serial_port *port) { BUG_ON(!port->driver->tx_empty); - if ( port->txbuf == NULL ) - port->txbuf = alloc_xenheap_pages( - get_order_from_bytes(serial_txbufsz), 0); + if ( port->txbuf != NULL ) + return; + if ( serial_txbufsz < 512 ) + serial_txbufsz = 512; + while ( serial_txbufsz & (serial_txbufsz - 1) ) + serial_txbufsz &= serial_txbufsz - 1; + port->txbuf = alloc_xenheap_pages( + get_order_from_bytes(serial_txbufsz), 0); } /* diff --git a/xen/include/xen/init.h b/xen/include/xen/init.h index 7e79e52fe3..4f9019afe0 100644 --- a/xen/include/xen/init.h +++ b/xen/include/xen/init.h @@ -78,7 +78,14 @@ extern initcall_t __initcall_start, __initcall_end; */ struct kernel_param { const char *name; - enum { OPT_STR, OPT_UINT, OPT_BOOL, OPT_INVBOOL, OPT_CUSTOM } type; + enum { + OPT_STR, + OPT_UINT, + OPT_BOOL, + OPT_INVBOOL, + OPT_SIZE, + OPT_CUSTOM + } type; void *var; unsigned int len; }; @@ -101,6 +108,10 @@ extern struct kernel_param __setup_start, __setup_end; static char __setup_str_##_var[] __initdata = _name; \ static struct kernel_param __setup_##_var __attribute_used__ \ __initsetup = { __setup_str_##_var, OPT_UINT, &_var, sizeof(_var) } +#define size_param(_name, _var) \ + static char __setup_str_##_var[] __initdata = _name; \ + static struct kernel_param __setup_##_var __attribute_used__ \ + __initsetup = { __setup_str_##_var, OPT_SIZE, &_var, sizeof(_var) } #define string_param(_name, _var) \ static char __setup_str_##_var[] __initdata = _name; \ static struct kernel_param __setup_##_var __attribute_used__ \ -- 2.30.2